package com.ruoyi.system.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.domain.SysStudentRank;
import com.ruoyi.system.mapper.SysStudentRankMapper;
import com.ruoyi.system.service.SysStudentRankService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * 系统-学生段位Service实现类
 * 基于 MyBatis-Plus 的 ServiceImpl 扩展，实现 SysStudentRankService 接口
 * 用于处理学生段位相关的业务逻辑
 *
 * @author 若依框架（可根据实际调整）
 */
@Service
public class SysStudentRankServiceImpl extends ServiceImpl<SysStudentRankMapper, SysStudentRank>
        implements SysStudentRankService {

    /**
     * 注入 SysStudentRankMapper，通过 MyBatis-Plus 或自定义 SQL 操作数据库
     * 这里既继承了 ServiceImpl，也保留了手动注入，可根据实际需求选择使用方式
     */
    @Resource
    private SysStudentRankMapper sysStudentRankMapper;

    /**
     * 根据用户ID查询段位信息（自定义方法，与接口 SysStudentRankService 约定）
     * 可根据实际需求，在 mapper 的 XML 中编写复杂查询逻辑
     *
     * @param userId 用户ID
     * @return 学生段位信息 SysStudentRank，无数据时返回 null
     */
    @Override
    public SysStudentRank selectRankByUserId(Long userId) {
        // 直接调用 Mapper 层自定义方法（需确保 SysStudentRankMapper 中已正确实现该方法）
        return sysStudentRankMapper.selectRankByUserId(userId);
    }

    /**
     * 额外新增的根据用户ID查询段位信息方法（示例，若接口有多个方法可继续扩展）
     * 若与 selectRankByUserId 功能重复，可根据实际接口定义调整
     *
     * @param userId 用户ID
     * @return 学生段位信息 SysStudentRank，无数据时返回 null
     */
    @Override
    public SysStudentRank getRankByUserId(Long userId) {
        // 同样调用 Mapper 层方法，可根据需要区分逻辑（如缓存、复杂校验等）
        return sysStudentRankMapper.selectRankByUserId(userId);
    }

    // 若有其他业务逻辑，可继续扩展方法，例如：
    // 1. 更新段位经验值
    // 2. 段位升级/降级逻辑
    // 3. 统计用户段位排名等
    // 以下为示例扩展方法（假设需求）：

    /**
     * 示例：更新用户段位经验值
     *
     * @param userId 用户ID
     * @param exp    要增加/减少的经验值（正数增加，负数减少）
     * @return 是否更新成功（true/false）
     */
    public boolean updateRankExp(Long userId, Integer exp) {
        SysStudentRank rank = selectRankByUserId(userId);
        if (rank == null) {
            return false;
        }
        // 简单处理经验值更新，实际可结合段位规则判断是否升级/降级
        rank.setCurrentExp(rank.getCurrentExp() + exp);
        return updateById(rank); // 利用 MyBatis-Plus 提供的 updateById 方法
    }
}